import { app, protocol, BrowserWindow } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
const path = require('path');

const isDevelopment = process.env.NODE_ENV !== 'production'

// 注册协议
protocol.registerSchemesAsPrivileged([
  { scheme: 'app', privileges: { secure: true, standard: true } }
])

async function createWindow() {
  // 创建浏览器窗口等其他主进程操作...
  const win = new BrowserWindow({
    width: 1920,
    height: 1080,
    frame: false,
    webPreferences: {
      disableHardwareAcceleration: true,
      // 使用 pluginOptions.nodeIntegration，请不要更改
      // 有关更多信息，请参见 nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration
      nodeIntegration: false,
      contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION,
      // 允许在渲染进程中访问 process.env
      preload: path.join(__dirname, '/preload.js')
    }
  })
  // 加载开发服务器的URL或主进程的index.html
  if (process.env.WEBPACK_DEV_SERVER_URL) {
    // 如果在开发模式下，加载开发服务器的URL
    await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
    if (!process.env.IS_TEST) win.webContents.openDevTools()
  } else {
    createProtocol('app')
    // 在非开发模式下加载 index.html
    win.loadURL('app://./index.html')
  }
}

// 当所有窗口都关闭时退出应用
app.on('window-all-closed', () => {
  if (process.platform !== 'darwin') {
    app.quit()
  }
})

// 在macOS上，点击 dock 图标并且没有其他窗口打开时，重新创建一个窗口
app.on('activate', () => {
  if (BrowserWindow.getAllWindows().length === 0) createWindow()
})

// 当 Electron 初始化完成时调用此方法，可以创建浏览器窗口等操作
app.on('ready', async () => {
  if (isDevelopment && !process.env.IS_TEST) {
    // 在开发模式中安装 Vue Devtools
    try {
      await installExtension(VUEJS_DEVTOOLS)
    } catch (e) {
      console.error('Vue Devtools 安装失败:', e.toString())
    }
  }

  createWindow()
})

// 在开发模式中，在从父进程收到退出请求时，优雅地退出
if (isDevelopment) {
  if (process.platform === 'win32') {
    process.on('message', (data) => {
      if (data === 'graceful-exit') {
        app.quit()
      }
    })
  } else {
    process.on('SIGTERM', () => {
      app.quit()
    })
  }
}